package com.it.schoolhomeos.entity;

import com.it.schoolhomeos.enums.NotificationStatus;
import com.it.schoolhomeos.enums.NotificationTargetRole;
import com.it.schoolhomeos.enums.NotificationType;
import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 通知实体类
 * 
 * 用于存储系统中的通知、公告、新闻等信息
 * 是学校、教师向家长和学生传达信息的重要渠道
 */
@Data
@Entity
@Table(name = "notification")
public class Notification {
    
    /**
     * 通知ID，主键，自增
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /**
     * 通知标题
     */
    @Column(nullable = false)
    private String title;
    
    /**
     * 通知内容，使用TEXT类型存储长文本
     */
    @Column(nullable = false, columnDefinition = "TEXT")
    private String content;
    
    /**
     * 通知类型，使用枚举类型
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private NotificationType type;
    
    /**
     * 发布者，多对一关系，关联到用户表
     */
    @ManyToOne
    @JoinColumn(name = "publisher_id", nullable = false)
    private User publisher;
    
    /**
     * 目标角色，表示该通知面向的用户群体，使用枚举类型
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private NotificationTargetRole targetRole;
    
    /**
     * 关联的班级，多对一关系，如果是针对特定班级的通知则设置此字段
     */
    @ManyToOne
    @JoinColumn(name = "class_id")
    private ClassInfo classInfo; // 如果是针对特定班级的通知
    
    /**
     * 通知附件，存储附件文件的URL，多个附件用逗号分隔
     */
    private String attachments;
    
    /**
     * 是否置顶，true表示置顶，false表示不置顶
     */
    private Boolean isTop = false;
    
    /**
     * 通知状态，使用枚举类型
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private NotificationStatus status = NotificationStatus.PUBLISHED;
    
    /**
     * 封面图片URL，主要用于新闻类型
     */
    private String coverImage;
    
    /**
     * 发布时间
     */
    private LocalDateTime publishTime;
    
    /**
     * 创建时间
     */
    @Column(nullable = false)
    private LocalDateTime createTime;
    
    /**
     * 更新时间
     */
    private LocalDateTime updateTime;
    
    /**
     * 设置通知ID
     * 
     * @param id 通知ID
     */
    public void setId(Long id) {
        this.id = id;
    }
} 